package com.yun.algorithmproblem.leetcode;

import java.util.Arrays;
import java.util.LinkedList;

/**
 * 给定一个循环数组 nums （ nums[nums.length - 1] 的下一个元素是 nums[0] ），返回 nums 中每个元素的 下一个更大元素 。
 * <p>
 * 数字 x 的 下一个更大的元素 是按数组遍历顺序，这个数字之后的第一个比它更大的数，这意味着你应该循环地搜索它的下一个更大的数。如果不存在，则输出 -1 。
 * 示例 1:
 * <p>
 * 输入: nums = [1,2,1]
 * 输出: [2,-1,2]
 * 解释: 第一个 1 的下一个更大的数是 2；
 * 数字 2 找不到下一个更大的数；
 * 第二个 1 的下一个最大的数需要循环搜索，结果也是 2。
 * 示例 2:
 * <p>
 * 输入: nums = [1,2,3,4,3]
 * 输出: [2,3,4,-1,4]
 */
public class Leetcode503 {
    public static void main(String[] args) {
        Leetcode503 obj = new Leetcode503();
        int[] nums = {1, 2, 3, 2, 1};
        int[] res = obj.nextGreaterElements(nums);
        System.out.println(Arrays.toString(res));
    }

    public int[] nextGreaterElements(int[] nums) {
        int len = nums.length;
        int maxNum = 0;

        int[] res = new int[len];
        LinkedList<Integer> stackTop = new LinkedList<>();
        LinkedList<Integer> stackBottom = new LinkedList<>();

        Arrays.fill(res, -1);
        stackTop.push(0);
        for (int i = 1; i < nums.length; i++) {
            Integer peekTop = stackTop.peek();
            if (nums[i] >= nums[peekTop]) {
                if (nums[i] > nums[peekTop]) {
                    while (!stackTop.isEmpty()) {
                        Integer pop = stackTop.pop();
                        res[pop] = nums[i];
                    }
                    maxNum = i;
                }
                while (!stackBottom.isEmpty()) {
                    Integer pop = stackBottom.pop();
                    res[pop] = nums[i];
                }
                stackTop.push(i);
            } else {
                if (stackBottom.isEmpty()) {
                    stackBottom.push(i);
                } else {
                    while (!stackBottom.isEmpty()) {
                        Integer peekBottom = stackBottom.peek();
                        if (nums[i] > nums[peekBottom]) {
                            Integer pop = stackBottom.pop();
                            res[pop] = nums[i];
                        } else {
                            break;
                        }
                    }
                    stackBottom.push(i);
                }
            }
        }
        int i=0;
        while (!stackBottom.isEmpty()){
            Integer peekBottom = stackBottom.peek();
            if(nums[i]>nums[peekBottom]){
                Integer pop = stackBottom.pop();
                res[pop] = nums[i];
            }else {
                i++;
            }
        }
        return res;
    }
}
